// https://blog.csdn.net/rxbook/article/details/130668154
// 装箱: 将任意类型赋值给一个接口类型变量
package main

import "fmt"

type users struct {
	age  int
	name string
}

func (users) M1() {}
func (users) M2() {}

type EmptyInterface interface {
}

type NonEmptyInterface interface {
	M1()
	M2()
}

func main() {
	var u = users{
		age:  21,
		name: "rxbook",
	}
	fmt.Println(u) //{21 rxbook}

	//开始装箱,经过装箱后，新分配的内存空间中的数据与原变量就没有关系了
	var i interface{} = u       //赋给空接口
	var j EmptyInterface = u    //赋给空接口(另一种写法)
	var k NonEmptyInterface = u //赋给非空接口
	u.age = 28
	fmt.Println(u) //修改原变量值后: {28 rxbook}

	//以下箱内数据都不会变
	fmt.Println(i) //{21 rxbook}
	fmt.Println(j) //{21 rxbook}
	fmt.Println(k) //{21 rxbook}

	//再比如下面这个精简的例子
	var x int = 61
	var y interface{} = x
	x = 62         // x的值已经改变
	fmt.Println(y) // y的值仍是61
}
